//package com.mall.order.biz.handler;
//
//import com.mall.commons.tool.exception.BizException;
//import com.mall.order.biz.context.CreateOrderContext;
//import com.mall.order.biz.context.TransHandlerContext;
//import com.mall.order.constant.OrderRetCode;
//import com.mall.order.dal.entitys.Stock;
//import com.mall.order.dal.persistence.StockMapper;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Component;
//import org.springframework.transaction.annotation.Transactional;
//import org.springframework.util.CollectionUtils;
//
//import java.util.List;
//import java.util.stream.Collectors;
//
///**
// * @Description: 扣减库存处理器
// * @Author： wz
// * @Date: 2019-09-16 00:03
// **/
//@Component
//@Slf4j
//public class SubStockHandler extends AbstractTransHandler {
//
//    @Autowired
//    private StockMapper stockMapper;
//
//	@Override
//	public boolean isAsync() {
//		return false;
//	}
//
//	/**
//	 * 扣减库存的处理
//	 * @param context
//	 * @return
//	 */
//	@Override
//	@Transactional(rollbackFor = Exception.class)
//	public boolean handle(TransHandlerContext context) {
//
//		CreateOrderContext createOrderContext = (CreateOrderContext) context;
//
//		List<CartProductDto> dtoList = createOrderContext.getCartProductDtoList();
//
//		List<Long> productIds = createOrderContext.getBuyProductIds();
//
//		if (CollectionUtils.isEmpty(productIds)) {
//			productIds = dtoList.stream().map(u -> u.getProductId()).collect(Collectors.toList());
//		}
//		productIds.sort(Long::compareTo);
//
//		List<Stock> stockList = stockMapper.findStocksForUpdate(productIds);
//
//		if (CollectionUtils.isEmpty(stockList)) {
//			throw new BizException(OrderRetCode.DB_EXCEPTION.getCode(),"库存未初始化！");
//		}
//		if (stockList.size() != productIds.size()) {
//			throw new BizException(OrderRetCode.DB_EXCEPTION.getCode(),"部分商品库存未初始化！");
//		}
//
//		for (CartProductDto cartProductDto : dtoList) {
//
//			Long productId = cartProductDto.getProductId();
//			Long productNum = cartProductDto.getProductNum();
//
//			Stock selectStock = stockMapper.selectStock(productId);
//			if (productNum > selectStock.getStockCount()){
//				throw new BizException("库存数量不足！");
//			}
//			if (productNum > selectStock.getRestrictCount()){
//				throw new BizException("订单商品数量超过限购数量！");
//			}
//
//			Stock stock = new Stock();
//			stock.setItemId(productId);
//			stock.setStockCount(-productNum);
//			stock.setLockCount(productNum.intValue());
//			stockMapper.updateStock(stock);
//		}
//
//		createOrderContext.setBuyProductIds(productIds);
//
//		return true;
//	}
//}